package com.cskaoyan.javase.oop2._1extends._7initialization._3super;

/**
 * super关键字 vs this关键字
 * 首先要明确,这两个关键字在以下场景是可以使用的:
 *      1.子类的成员方法
 *      2.子类的构造器(在构造器中,它们有特殊的用途,可以用来指向其它构造器)
 *      3.子类的构造代码块
 * 其中,成员方法,构造代码块中的它们,只能用于访问成员变量/方法,不能用于调用构造器
 *
 * this: 指向的是子类对象自身,所以this指向对象,它就是一个引用,就是一个对象名
 * super: 指向的是子类对象当中,父类成员的区域,它不是一个引用,这是super和this之间的最大区别
 * 表现在代码上就是: this是引用可以直接输出,super不行,不能输出
 *
 * 除了这个最大的区别之外,它们的使用是差不多的,只不过this指向子类,super指向父类
 *
 * 很明显this是包含super的,所以this既可以访问自身成员,也可以父类成员
 * 但super只能访问父类成员
 * 当出现父子类成员同名时,this和super的区别作用就完全体现了:
 *      super指向父类同名成员
 *      this指向子类同名成员
 *
 * 总结:
 *      1.大多数情况下,this会覆盖super的用途,但当出现父子类同名成员时,可以用super区分
 *      2.this和super在子类构造器中可以用来表示调用构造器,this表示调用自身
 *          super表示调用父类
 *      3.this是一个引用,super不是,this可以直接输出,super不行
 *      4.this毕竟是在自身类中使用,所以自己不受权限限制
 *          但是super毕竟可以近似看为指向父类
 *          父类和子类毕竟不是一个类
 *          所以super在表示调用父类成员时,受权限限制
 *
 * @since 11:04
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Son s = new Son();
        s.accessNum(888);
    }
}

class Father {
    int num = 666;

    public void testFather() {
    }
}

class Son extends Father {
    private int num = 777;

    public void accessNum(int num) {
        // 就近原则
        System.out.println(num);
        System.out.println(this.num);
        System.out.println(super.num);
    }

    public void testSon() {
        System.out.println(this);
        // System.out.println(super);
        this.testFather();
        super.testFather();
        System.out.println(this.num);
        // super.num
    }

}